// utils/token.js - 令牌管理工具

/**
 * 获取访问令牌
 * @returns {string|null} 令牌值
 */
export const getToken = () => {
  return uni.getStorageSync('token') || null;
};

/**
 * 设置访问令牌
 * @param {string} value 令牌值
 */
export const setToken = (value) => {
  // 如果值已包含Bearer前缀，则去除
  if (value && value.startsWith('Bearer ')) {
    value = value.substring(7);
  }
  uni.setStorageSync('token', value);
};

/**
 * 移除访问令牌
 */
export const removeToken = () => {
  uni.removeStorageSync('token');
};

/**
 * 获取刷新令牌
 * @returns {string|null} 刷新令牌值
 */
export const getRefreshToken = () => {
  return uni.getStorageSync('refreshToken') || null;
};

/**
 * 设置刷新令牌
 * @param {string} value 刷新令牌值
 */
export const setRefreshToken = (value) => {
  // 确保没有多余的前缀
  if (value && value.startsWith('Bearer ')) {
    value = value.substring(7);
  }
  uni.setStorageSync('refreshToken', value);
};

/**
 * 移除刷新令牌
 */
export const removeRefreshToken = () => {
  uni.removeStorageSync('refreshToken');
};

/**
 * 检查令牌是否存在
 * @returns {boolean} 是否存在令牌
 */
export const hasToken = () => {
  return !!getToken();
};

/**
 * 检查令牌是否过期
 * 此方法仅根据本地数据判断，更准确的方法是让服务器解析令牌
 * @returns {boolean} 是否过期
 */
export const isTokenExpired = () => {
  const tokenExpireTime = uni.getStorageSync('tokenExpireTime');
  if (!tokenExpireTime) return true;
  
  // 判断令牌是否已过期，预留30秒刷新时间
  return Date.now() >= tokenExpireTime - 30000;
};

/**
 * 获取带Bearer前缀的认证头
 * @returns {string} 完整的认证头
 */
export const getAuthHeader = () => {
  const tokenValue = getToken();
  if (!tokenValue) return '';
  return `Bearer ${tokenValue}`;
};

export default {
  getToken,
  setToken,
  removeToken,
  getRefreshToken,
  setRefreshToken,
  removeRefreshToken,
  hasToken,
  isTokenExpired,
  getAuthHeader
};